Device drivers are kernel modules that interact with peripheral hardware and their controllers. Device drivers traditionally are pluggable or independently developable modules of an operating system (OS). Typically, device drivers have two pools of data structures that they create and manage. The first, referred to as OS interface pool, comprises queues/interfaces that are employed to interact with other layers/modules of the kernel. The second, referred to as hardware interface pool, comprises queues/data structures shared between the device driver and the hardware.
Typically, the size of the OS and hardware interface pools used by a device driver is pre-decided during the design stage (and validated during the testing phase). The device drivers are designed to start with fixed/pre-allocated shared memory resources for the above two pools of data structures during initialization phase-during system boot-up or when the driver is dynamically loaded for the first time—where the device drivers are associated with the hardware they are managing/controlling. It is possible for the device drivers to aggregate the respective OS interface pools into a single pool. These shared memory resources (or shared pool entries) are used on a first come first serve basis by the device drivers that manage similar hardware or protocol. Aggregation of hardware resource pools across different device drivers may be difficult as the current hardware may not be able to deal with scattered data structures as their input/output (I/O) queues/pools.
Typically, pool sizes are determined based on benchmark testing and maximum I/O throughput testing, performed during product release testing phase. However, during operation, these pools may be either under-utilized or over-subscribed. Under-utilization may usually be a result of applications performing less number of I/Os. If these I/O sizes are reasonably large, the throughput can still be reasonably good. Over subscription may usually arise out of spikes in I/O patterns of applications, such as an application/system performing a large number of small sized I/Os. In such situations, the bandwidth utilization and I/O throughput can suffer.
Other features of the present embodiments will be apparent from the accompanying drawings and from the detailed description that follows.